<?php

class PerfilController extends Controller {

    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'perfil';
    /**
     * @var PerfilService
     */
    private $perfilService;
    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var AcaoService
     */
    private $acaoService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por PerfilController
     */
    public function __construct() {
        $this->perfilService = PerfilService::getInstance();
        $this->funcaoService = FuncaoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->acaoService = AcaoService::getInstance();
    }

    /**
     * @method  listarPerfis
     *
     * Realiza a listagem dos perfis no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Janeiro de 2012
     */
    public function listarPerfis() {
        $ArProfile = $this->perfilService->findAll();
        $this->perfilService->fillProfileWithPosition($ArProfile);
        $this->save(SESSION_INTERFACE, 'ProfileList', $ArProfile);
        $this->view('listar_perfis', self::PACKAGE_VIEW);
    }

    /**
     * @method  cadastrarPerfil
     *
     * Chama a view de cadastro de perfil carregando todas as acoes disponiveis
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Janeiro de 2012
     */
    public function cadastrarPerfil() {
        $this->save(SESSION_INTERFACE, 'PositionList', $this->funcaoService->findAll());
        $this->save(SESSION_INTERFACE, 'ActionList', $this->acaoService->findAll());
        $this->view('cadastrar', self::PACKAGE_VIEW);
    }

    /**
     * @method  inserir
     *
     * Realiza a insercao do perfil no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Janeiro de 2012
     */
    public function inserir() {
        $ArDados = $_POST;
        if (empty($ArDados['IDFuncao'])) {
            $this->saveReturn('O campo "Fun&ccedil;&atilde;o" n&atilde;o foi recebido.');
        } else if (empty($ArDados['StPerfil'])) {
            $this->saveReturn('O campo "Perfil" n&atilde;o foi recebido.');
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->perfilService->save($ArDados)) {
                $this->saveReturn('Perfil criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar Perfil.');
            }
        }
        $this->showJsonResponse();
    }

    /**
     * @method  editarPerfil
     *
     * Chama a view de perfil carregando o perfil atraves do id enviado pela url
     * alem de carregar todas as acoes e a lista de funcoes
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Janeiro de 2012
     */
    public function editarPerfil() {
        $IDPerfil = treatUrl('id');
        multipleEntities($IDPerfil);
        $ArPositions = $this->funcaoService->findAll();
        $Profile = $this->perfilService->findById($IDPerfil);
        $ArActions = $this->acaoService->findAllRestrictActions();

        $this->save(SESSION_INTERFACE, 'ProfileEdit', $Profile);
        $this->save(SESSION_INTERFACE, 'PositionList', $ArPositions);
        $this->save(SESSION_INTERFACE, 'ActionsList', $ArActions);

        $this->view('editar', self::PACKAGE_VIEW);
    }

    /**
     * @method  atualizar
     *
     * Realiza a atualizacao de um perfil enviado por post
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Janeiro de 2012
     */
    public function atualizar() {
        $ArDados = $_POST;
        if (empty($ArDados['IDFuncao'])) {
            $this->saveReturn('O campo "Função" n&atilde;o foi recebido.');
        } else if (empty($ArDados['StPerfil'])) {
            $this->saveReturn('O campo "Perfil" n&atilde;o foi recebido.');
        } else if (empty($ArDados['IDPerfil'])) {
            $this->saveReturn('O campo "ID" n&atilde;o foi recebido.');
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->perfilService->update($ArDados)) {
                $this->saveReturn('Perfil atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao atualizado Perfil.');
            }
        }
        $this->showJsonResponse();
    }

    public function excluirPerfil() {
        $IDPerfil = treatUrl('id');
        multipleEntities($IDPerfil);

        $this->save(SESSION_INTERFACE, 'UserList', $this->usuarioService->findByProfile($IDPerfil));
        $this->save(SESSION_INTERFACE, 'ProfileList', $this->perfilService->findAll());
        $this->save(SESSION_INTERFACE, 'ProfileEdit', $this->perfilService->findById($IDPerfil));

        $this->view('delete', self::PACKAGE_VIEW);
    }

    public function deletarPerfil() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        $ArDados['Usuario'] = !empty($ArDados['Usuario']) ? $ArDados['Usuario'] : array();

        foreach ($ArDados['Usuario'] as $IDUsuario) {
            if (!$this->hasReturn() && empty($IDUsuario)) {
                $this->saveReturn('Erro ao receber os ID\'s de Usuários de mudanças.');
            }
        }

        if( !$this->hasReturn() ) {
            $Retorno = $this->perfilService->delete($ArDados['IDPerfil'], $ArDados['Usuario']);
            $this->saveReturn(
                $Retorno->getMessage(),
                $Retorno->getType()
            );
        }

        $this->showJsonResponse();
    }

        /**
     * @method  visualizarPerfil
     *
     * Chama a view de visualiza��o de perfil
     *
     * @author  Rafael Costa <rcosta.dev@gmail.com>
     * @since   Setembro de 2012
     */

    public function visualizarPerfil() {
        $IDPerfil = treatUrl('id');
        multipleEntities($IDPerfil);
        $Perfil = $this->perfilService->findById($IDPerfil);
        if (empty($Perfil)) {
            return redirect('perfil', 'listar-perfis');
        }
        $this->save(SESSION_INTERFACE, 'Profile', $Perfil);
        $this->view('visualizar_perfil', self::PACKAGE_VIEW);
    }

}

?>
